/*
 * @Author: intellectual-seeker 3336339701@qq.com
 * @Date: 2025-08-23 09:50:50
 * @LastEditors: intellectual-seeker 3336339701@qq.com
 * @LastEditTime: 2025-08-23 20:21:08
 * @FilePath: /code/lesson29/testSig.cc
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include <unistd.h>
#include <iostream>
using namespace std;
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <signal.h>

//问题验证2：handler递达与清0操作的顺序
void handler(int signo)
{
    sigset_t sig;
    sigemptyset(&sig);
    sigpending(&sig);

    if(sigismember(&sig, signo))
    {
        cout << "先执行handler" << endl;
    }
    else
    {
        cout << "先清0" << endl;
    }
}

int main()
{
    signal(SIGINT, handler);

    while(true)
    {
        cout << "process pid is : " << getpid() << endl;
        sleep(1);
    }

    return 0;
}

//问题验证1：屏蔽所有信号
// void PrintPending()
// {
//     sigset_t sig;
//     sigemptyset(&sig);
//     sigpending(&sig);

//     for(int i = 31; i > 0; i--)
//     {
//         if(sigismember(&sig, i))
//         {
//             cout << "1";
//         }
//         else
//         {
//             cout << "0";
//         }
//     }
//     cout << " , pid is : " << getpid() << endl;
// }

// int main()
// {
//     sigset_t sig;
//     sigemptyset(&sig);

//     for(int i = 1; i <= 31; i++)
//         sigaddset(&sig, i);

//     int n = sigprocmask(SIG_SETMASK, &sig, nullptr);
//     assert(n == 0);
//     (void)n;

//     cout << "signal mask success..." << endl;

//     while(true)
//     {
//         PrintPending();
//         sleep(1);
//     }

//     return 0;
// }

//除0异常
// int main()
// {
//     int a = 10;
//     a /= 0;

//     return 0;
// }

//观察退出码
// int main()
// {
//     pid_t pid = fork();
//     if(pid == 0)
//     {
//         int a = 10;
//         a /= 0;

//         exit(0);
//     }

//     int status = 0;
//     pid_t rid = waitpid(pid, &status, 0);
//     if(rid ==  pid)
//     {
//         cout << "exit code : " << ((status >> 8) & 0xFF) << endl;
//         cout << "exit signal : " << ((status) & 0x7F) << endl;
//         cout << "core dump : " << ((status >> 7) & 0x1) << endl;

//         cout << "status : " << status << endl;
//     }

//     return 0;
// }

//正常退出
// int main()
// {
//     //int n = open("text.txt", O_RDONLY);//文件不存在，打开失败
//     //if(n < 0)
//     //    return -1;

//     return 0;
// }

//被信号杀死，异常退出
// int main()
// {
//     while(true)
//     {
//         cout << "pid is : " << getpid() << endl;
//         sleep(1);
//     }

//     return 0;
// }